package com.example.demoamqp.send;

import com.example.demoamqp.conatants.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Topic模式
 * 发送者
 *
 * @className: TopicSender
 * @projectName: demo-one
 * @auth: rosszhang
 * @date: 2023/12/28 16:11
 */
@Slf4j
@Component
public class TopicSender {
    private AmqpTemplate rabbitAmqpTemplate;
    private RabbitTemplate rabbitTemplate;

    @Autowired
    public void setRabbitAmqpTemplate(AmqpTemplate rabbitAmqpTemplate) {
        this.rabbitAmqpTemplate = rabbitAmqpTemplate;
    }

    @Autowired
    public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    /**
     * topic模式下，生产者发送信息给交换机，可以决定给哪个队列发信息
     *
     * @param msg        发送的信息
     * @param routingKey 类似正则表达式，决定给谁发
     *                   .with("topic.xxx"); // 规则 topic.xxx ---- A队列
     *                   .with("topic.*"); // 规则 topic.xxx   ---- B队列
     *                   在配置类中，如上所述配置，则如果输入的routingKey为 topic.xxx则给A和B发；
     *                   如果输入的routingKey为 topic.yyy 则 只给B队列发；
     */
    public void sendMsg(String msg, String routingKey) {
        rabbitAmqpTemplate.convertAndSend(
                Constants.MQ_TOPIC_EXCHANGE,
                routingKey, // "topic.yyy",此时只有B队列有信息
                msg);
        log.debug("[生产者向交换机：] 发送一条信息：{}", msg);
//
//        rabbitTemplate.setConfirmCallback(
//                (c, ack, message) -> {
//                    log.debug("***** setConfirmCallback：ack--{}", ack); // 是否发送到交换机
//                    log.debug("***** setConfirmCallback：c-->{}", c);
//                    // channel error; protocol method: #method<channel.close>(reply-code=404,
//                    // reply-text=NOT_FOUND - no exchange 'aaaa' in vhost '/', class-id=60, method-id=40)
//                    log.debug("***** setConfirmCallback：m-->{}", message);
//                    if (ack) {
//                        log.debug("[生产者：] 发送信息到交换机{}", "RabbitMqConstants.MQ_TOPIC_EXCHANGE");
//                    } else {
//                        log.debug(message);
//                    }
//                }
//        );
//
//        rabbitTemplate.setReturnsCallback(r -> {
//            log.debug("返回文字{}", r.getReplyText());
//            log.debug("返回code{}", r.getReplyCode());
//            log.debug("返回Exchange{}", r.getExchange());
//            log.debug("返回RoutingKey{}", r.getRoutingKey());
//        });
//
//
//        rabbitTemplate.convertAndSend(
//                Constants.MQ_TOPIC_EXCHANGE,
////                "aaaa",// 失败的情况
//                routingKey, // "topic.yyy",此时只有B队列有信息
//                msg);
//
    }

}
